package busterminal.command.busmodel;

import busterminal.command.AbstractCommand;
import busterminal.entity.BusModel;
import busterminal.entity.service.VehicleType;
import busterminal.exception.BusinessException;
import busterminal.persistence.BusModelDAO;
import busterminal.services.ServiceLocator;
import java.util.Arrays;
import java.util.List;

/**
 * Класс, реализующий действие: обновить информацию про модель автобуса
 */
public class UpdateBusModelCommand extends AbstractCommand {

    /**
     * Имя параметра "Идентификатор модели"
     */
    private final static String PARAM_MODEL_BUS_ID = "Model bus ID";
    /**
     * Имя параметра "Название новой модели"
     */
    private final static String PARAM_NEW_MODEL_NAME = "Model name";
    /**
     * Имя параметра "Новое название типа транспортного средства"
     */
    private final static String PARAM_NEW_VEHICLE_TYPE = "Vehicle type";

    /**
     * Конструктор по умолчанию
     */
    public UpdateBusModelCommand() {
        super("Update info about bus model");
    }

    /**
     * Выполнить команду: обновить информацию про модель автобуса (изменение названия модели автобуса)
     */
    @Override
    public void execute() {
        BusModelDAO busModelDAO = ServiceLocator.getService(BusModelDAO.class);
        String parametrId = parameters.get(PARAM_MODEL_BUS_ID);
        int ID;
        try {
            ID = Integer.parseInt(parametrId);
        } catch (Exception e) {
            throw new BusinessException("Invalid model bus ID='" + parametrId + "';" + e.toString(), e);
        }
        BusModel busModel = busModelDAO.read(ID);
        busModel.setModelName(parameters.get(PARAM_NEW_MODEL_NAME));
        String vehicleType = parameters.get(PARAM_NEW_VEHICLE_TYPE);
        try {
            busModel.setVehicleType(VehicleType.valueOf(vehicleType.toUpperCase()));
        } catch (Exception e) {
            throw new BusinessException("Incorrect vehicle type: '" + parameters.get(vehicleType) + "'; " + e.toString(), e);
        }              
        busModelDAO.update(busModel);
    }

    /**
     * Получить список имён параметров
     * @return список имён параметров
     */
    @Override
    public List<String> getParametersNames() {
        return Arrays.asList(PARAM_MODEL_BUS_ID, PARAM_NEW_MODEL_NAME, PARAM_NEW_VEHICLE_TYPE);
    }
    
    /**
     * Вывести список доступных вариантов параметра с фиксированным набором значений
     * @param parameterName имя параметра с фиксированным набором значений
     */
    @Override
    public void showAccessableVariants(String parameterName) {
        if (PARAM_NEW_VEHICLE_TYPE.equals(parameterName)) {
            System.out.println("Accessable variants: " + VehicleType.getValues());
        }
    }    
    
}
